package com.liuyjy.redis.annotations;



import com.liuyjy.redis.lock.RedissonLockConstant;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;

/**
 * @Author liuyjy
 * @Date 2025/2/7 12:32
 * @Description: 分布式锁注解
 * 用法 1、@RedissonLock(keyExpression = "#request.identifier", scene = "keyString")
 * 2、@RedissonLock(keyExpression = "#identifier", scene = "keyString")
 **/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RedissonLock {

    /**
     * 锁的场景
     *
     * @return String
     */
    String scene();

    /**
     * 加锁的key，优先取key()，如果没有，则取keyExpression()
     *
     * @return String
     */
    String key() default RedissonLockConstant.NONE_KEY;

    /**
     * SPEL表达式:
     * <pre>
     *     #id
     *     #insertResult.id
     * </pre>
     *
     * @return String
     */
    String keyExpression() default RedissonLockConstant.NONE_KEY;

    /**
     * 超时时间，毫秒
     * 默认情况下不设置超时时间，会自动续期
     *
     * @return int
     */
    int expireTime() default RedissonLockConstant.DEFAULT_EXPIRE_TIME;

    /**
     * 加锁等待时长，毫秒
     * 默认情况下不设置等待时长，会一直等待直到获取到锁
     *
     * @return int
     */
    int waitTime() default RedissonLockConstant.DEFAULT_WAIT_TIME;

    /**
     * 超时时间单位
     *
     * @return TimeUnit
     */
    TimeUnit timeUnit() default TimeUnit.MILLISECONDS;

    /**
     * 是否阻塞式获取锁
     * 默认情况下不阻塞式获取锁
     *
     * @return boolean
     */
    boolean blocking() default false;

    /**
     * 获取不到锁时提示
     *
     * @return boolean
     */
    String noLockMsg() default RedissonLockConstant.NO_LOCK_MSG;
}
